import { ApiRes } from '@/types/data'
import { defineStore } from 'pinia'
import { CartItem } from '@/types/types/cart'
import request from '@/utils/request'
import useUserStore from './user'
export default defineStore('cart', {
  persist: {
    key: 'rabbit-cart',
    // storage: window.localStorage  //默认储存位置
  },
  state() {
    return {
      list: [] as CartItem[]
    }
  },
  actions: {
    // 添加商品到购物车
    async addCart(data: any) {
      if (this.isLogin) {
        // 登录状态
        const { skuId, count } = data
        await request.post('/member/cart', { skuId, count })
        this.getCartList()
      } else {
        // 未登录状态
        // console.log(data)
        // 判断本地是否有此商品
        const goods = this.list.find((item) => item.skuId === data.skuId)
        if (goods) {
          // 2. 如果商品存在，直接把数量加起来
          goods.count += data.count
        } else {
          // 3. 如果商品不存在，直接添加该商品
          this.list.unshift(data)
        }
      }
    },
    // 获取购物车列表
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<ApiRes<CartItem[]>>('/member/cart')
        this.list = res.data.result
      } else {

        // 遍历发送请求, 校验更新sku商品的库存和价格, 是否有效
        this.list.forEach(async cartItem => {
          const { skuId } = cartItem
          // 根据 skuId 获取最新商品信息
          const res = await request.get<ApiRes<CartItem>>(
            `/goods/stock/${skuId}`
          )
          // 保存最新商品信息
          const lastCartInfo = res.data.result
          // 更新商品现价
          cartItem.nowPrice = lastCartInfo.nowPrice
          // 更新商品库存
          cartItem.stock = lastCartInfo.stock
          // 更新商品是否有效
          cartItem.isEffective = lastCartInfo.isEffective
        })
      }
    },
    // 删除购物车商品
    async deleteCart(skuIds: string[]) {
      if (this.isLogin) {
        await request.delete('/member/cart', {
          data: { ids: skuIds }
        })
        // 重新获取最新购物车列表
        this.getCartList()
      } else {
        // 获取本本地
        this.list = this.list.filter(item => !skuIds.includes(item.skuId))
      }
    },

    // 购物车全选反选
    async selectAll(ids: string[], selected: boolean) {
      if (!this.isLogin) return
      await request.put('/member/cart/selected', { ids, selected })
    },

    // 更新购物车商品状态
    async updateCart(id: string, selected: boolean, count?: number) {
      if (!this.isLogin) return
      await request.put('/member/cart/' + id, { selected, count })
      // 重新获取最新购物车列表
      // this.getCartList()
    },
    // 合并购物车
    async mergeLocalCart() {
      const data = this.list.map(({ skuId, selected, count }) => ({
        skuId,
        selected,
        count
      }))
      await request.post('/member/cart/merge', data)
      // 合并成功，重新获取购物车列表
      this.getCartList()
    }
  },

  getters: {
    // 🔑登录状态
    isLogin(): boolean {
      const user = useUserStore()
      return !!user.userInfo.token
    },
    // 计算有效商品列表 isEffective = true  filter
    effectiveList(): CartItem[] {
      return this.list.filter((item) => item.stock > 0 && item.isEffective)
    },
    // 有效商品总数量 把effctiveList中的每一项的count叠加起来
    effectiveListCounts(): number {
      return this.effectiveList.reduce((sum, item) => sum + item.count, 0)
    },
    // 总钱数  = 所有单项的钱数累加  单项的钱数 = 数量 * 单价
    effectiveListPrice(): string {
      return this.effectiveList
        .reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
        .toFixed(2)
    },
    // 已选择的列表
    selectedList(): CartItem[] {
      return this.effectiveList.filter((item) => item.selected)
    },
    // 已选择的商品总数
    selectedListCounts(): number {
      return this.selectedList.reduce((sum, item) => sum + item.count, 0)
    },
    // 已选择的列表总价
    selectedListPrice(): string {
      return this.selectedList
        .reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
        .toFixed(2)
    }

  },
})